/* SqStack.h */
/* ˳��ջ���Ͷ��弰��������(�ö�̬����ʵ��˳��ջ)
   ����ʼ������ջ�ա���ջ����ջ��ȡջ���������ʾ
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#include "..\..\headers\PreDef.h"  //Ԥ����

/* ˳��ջ�Ķ�̬����洢�ṹ */
//typedef int SElemType;      //Ԫ������SElemTypeΪint
typedef struct {//��������
 int row, col;
}PosType;

typedef struct {//ջԪ������:
 int ord;	//ͨ������·���ϵġ���š�
 PosType seat;	//ͨ�������Թ��еġ�����λ�á�
 int di;	//������һͨ����ġ�����(1,2,3,4�ֱ����,��,��,��)
}SElemType;

#define STACK_INIT_SIZE 100 //��ʼ����
#define STACKINCREMENT   10 //��������
typedef struct{
 SElemType *base; //ջ��ָ��
 SElemType *top;  //ջ��ָ��(ָ��ջ��Ԫ�صĺ�һ��λ��)
 int stacksize;   //��ǰ����
}SqStack;


/* ��ʼ��������һ����ջS */
Status InitStack(SqStack &S) {
 unsigned int nSize;
 nSize = STACK_INIT_SIZE * sizeof(SElemType); //������ռ��ֽ���
 S.base = (SElemType *)malloc(nSize); //�����ʼ�Ĵ洢�ռ�
 if (!S.base)    //��δ����ɹ���
  exit(MEMOVERFLOW); //����ֹ����(�˳���MEMOVERFLOW)
 S.top = S.base;                //��ʼջ��
 S.stacksize = STACK_INIT_SIZE; //��ʼ����
 return OK; 
}//InitStack

/* ��ջ��:
   ��S�ǿ�ջ�򷵻�TRUE�����򷵻�FALSE
*/
Status StackEmpty(SqStack &S) {
 return (S.top == S.base);
}//StackEmpty

/* ���٣��ͷ�˳��ջS��ռ�Ĵ洢�ռ� */
void DestroyStack(SqStack &S) {
 free(S.base); //�ͷ�˳���L��ռ�Ĵ洢�ռ�
}//DestroyStack

/* ��ջ������Ԫ��eΪ�µ�ջ��Ԫ��
*/
Status Push(SqStack &S, SElemType e) {
 unsigned int nSize;
 //��������������չ:
 if ((S.top - S.base) == S.stacksize) { //�����ݣ������ݣ�
  nSize = S.stacksize + STACKINCREMENT; //������
  S.base = (SElemType *)realloc(S.base, nSize * sizeof(SElemType)); //���·���ռ�
  if (!S.base)        //��δ����ɹ���
   exit(MEMOVERFLOW); //����ֹ����(�˳���MEMOVERFLOW)
  S.top = S.base + S.stacksize; //��ջ��=��ջ��+ԭ����
  S.stacksize = nSize; //������  
 }//end if
 *(S.top) = e;  //e��ջ��
 S.top++;       //ջ��ָ���1
 return OK;
}//Push 

/* ��ջ��ɾ��ջ��Ԫ�أ�����e����
   ��ɾ���ɹ�����OK�����򷵻�ERROR��
*/
Status Pop(SqStack &S, SElemType &e) {
 if (StackEmpty(S))  //��ջ��,
  return ERROR;      //����ERROR
 S.top--;      //ջ��ָ���1
 e = *(S.top); //ջ��Ԫ������e
 return OK;
}//Pop 

/* ȡջ������e����ջ��Ԫ��
   ���ɹ�����OK�����򷵻�ERROR��
*/
Status GetTop(SqStack &S, SElemType &e) {
 if (StackEmpty(S))  //��ջ��,
  return ERROR;      //����ERROR
 e = *(S.top - 1);   //ջ��Ԫ������e
 return OK;
}//GetTop 


/* ���´���Ϊ��ʾ���� */
/*
void ShowStack(SqStack &S) //��ʾջ
{int k, n;

 n = S.top - S.base; //ջ��
 if (n < 1)
  { printf("��ջ\n\n"); return;}
 for (k = n; k >= 1; k--)
  printf("%2d%4d\n", k, S.base[k-1]);
 printf("\n");
}//ShowStack
*/